System 7.5.5 includes changes to the Virtual Memory Manager, some substantial Code Fragment Manager improvements, and a variety of enhancements and improvements. We recommend this update for all Macintosh computers running System 7.5.3. System 7.5.5 will only install on a Macintosh or Mac OS-compatible computer running some version of System 7.5.3. If you are running an earlier version of System Software, you need to upgrade to System 7.5.3 before you can install System 7.5.5.
We rewrote parts of the Virtual Memory Manager for all machines that can support virtual memory. Performance using virtual memory should be substantially improved. When compared to the currently shipping virtual memory, when VM is turned on, the system boots up faster, Power Macintosh applications launch faster, and QuickTime movies play smoother. The following sections describe some of the features of this new VM.
• VM Performance Issues
- We improved the page aging algorithm.
Every 8 page faults, we aged the physical RAM pages and refilled the
"victim" list consisting of the pages that are to be replaced in the
next 8 page faults. The function which did this could take up to 46 ms
to age 48 MB of RAM on a Power Macintosh 7500. We replaced the
algorithm used by this function with a much simpler and faster
algorithm. Worst case for the new algorithm is about the same as the
current algorithm because it only has to look at every physical page
about once. The pause every 8 page faults is gone.
- Pages are written to disk multiple times because the act of writing a
page to disk marks the virtual memory page dirty.
When a dirty logical page is replaced, a virtual memory optimization
finds up to 6 additional dirty pages contiguous in the virtual memory
backing store file, marks the pages clean, and then writes them out to
disk with a single write request. Since it's likely that dirty logical
pages close to a dirty logical page will have a similar "age" and thus
will likely be replaced in the near future, too, this optimization
will likely make future page faults faster.
However, LockMemory marks all of the pages locked as dirty and since
LockMemory is called on pages written by DMA I/O devices, the
just-cleaned pages are dirtied when they are written. That results in
an I/O trace to the virtual memory backing store file that can look
something like "write 7 pages, read one page, write 7 pages, read one
page " instead of the intended "write 7 pages, read 1 page, read 1
extern pascal OSErr LockMemoryForOutput(void *address, unsigned long
count)
TWOWORDINLINE(0x700A, 0xA05C);
Developers can determine if LockMemoryForOutput is available by testing
for the gestaltVMHasLockMemoryForOutput bit (bit 1) in the gestaltVMAttr
Gestalt selector. If bit 1 is set, LockMemoryForOutput is available.
• VM Bug Fixes
- System stability improvements
We fixed several internal calls which had the potential of hanging or
crashing your machine when passed invalid arguments. Because of a bug
in VM, CFM could occasionally leave a file open when it should not be
left open. Several crashing conditions in HoldMemory and LockMemory
were repaired. Other fixes which had previously been made in PowerPC
VM were rolled into 68K VM as well.
- Added two new SysError values
If VM's deferred user function table ran out of entries, VM would
trash low memory starting at location 0. We now call SysError with
dsVMDeferredFuncTableFull (112) instead of trashing memory off of a
NULL pointer. You can get this error in several ways. One way is to
defer already-deferred i/o requests. Another way is to install a Time
Manager task which has already been installed. VM was ignoring all
errors while reading or writing to the "VM Storage" backing store
file. If there was an error, the system would likely crash later with
a seemingly unrelated problem. There's no way to continue or recover
if this happens, so VM now calls SysError with dsVMBadBackingStore
(113) instead of continuing on with a bad page or memory. This error
can happen whenever your backing store volume returns an error.
Examples can be genuine disk i/o errors, losing battery power on a
SCSI-disk-mode PowerBook, turning off an external hard disk which
contains your backing store, and so forth.
- Calls which may be deferred to VM safe time
The following parts of the system are patched by virtual memory so
that they may possibly be deferred to VM safe time:
PostEvent
Time Manager tasks
Read, Write, Control, & Status driver calls
VBL tasks
Slot VBL tasks
ADBOp
SCSIDispatch
Inside Macintosh:Memory page 3-11 has a discussion of page faults and
deferring user code while the driver of the paging device in busy. The
list on page 3-12 is incomplete; the types of code listed above are a
more complete list, based on the current VM sources.
- VM now holds some stack for Control and Status calls
VM now holds 2K of stack for all _Control and _Status calls. This 2K
of stack was previously being held for _Read and _Write calls.
These changes apply to all machines which can run virtual memory (that is, all machines except the Macintosh Plus, SE, Classic, LC, Portable, PowerBook 100, or Macintosh II without a PMMU).
Code Fragment Manager
---------------------
We now load libraries better in low memory situations when virtual memory is off. This should help products which use a fair amount of memory (for example, multimedia games) on small memory configuration entry-level Macintosh computers. In particular, a "private copy" of the code for a shared library is now placed in the application heap if there is sufficient room in the application heap, but there is no room in temporary memory or the system heap. The Code Fragment Manager will use no more than the difference between the minimum memory partition size and the actual memory partition size for this private copy.
We bypass the file system cache (using the technique documented in Inside Macintosh:Files on page 2-95) when reading fragments in memory. We use BlockMoveData in more places. These changes result in faster application loading.
A possible confusing issue for developers is that the Code Fragment Manager may return different error codes under System 7.5.5 than it did under System 7.5.3 or earlier, especially in the case of a missing weakly imported library (called a soft import in Inside Macintosh:PowerPC System Software.) The error code returned will depend upon the options passed to GetSharedLibrary. In particular the errors cfragNoLibraryErr (-2804) and cfragLibConnErr (-2817) might be returned for very similar reasons. Developers should treat these errors as interchangeable. You should check for the existence of weakly imported symbol by using the code in Inside Macintosh: PowerPC System Software on page 1-25, rather than by calling GetSharedLibrary and depending upon a specific error code being returned.
These changes apply to all PowerPC based Macintosh computers. There are no changes to the 68K version of the Code Fragment Manager in this release.
Modern Memory Manager
---------------------
If an application tried to allocate a small negative amount of memory it would crash with a type 11 error. Inside the Modern Memory Manager, we changed a local variable from signed long to unsigned long, and added checking for overflow from high positive numbers to low negative ones. This affects all PowerPC Macintosh computers.
Background-Only Applications
----------------------------
If two (or more) background-only applications were running and both called MaxApplZone, the system would hang, because the Process Manager was not correctly saving and restoring the process state for each application. (This is the bug documented in Technote PS 2, "Background Only Applications.") This bug had existed since the introduction of faceless background applications. We now correctly save and restore the process state for each application. This affects all machines.
Floppy disk insertion and asynchronous i/o bug
----------------------------------------------
On a Macintosh 6100, 7100, or 8100 machine, when a floppy disk was inserted and there was asynchronous file system activity going on, the machine could hang. An internal routine was incorrect because the ROM was finalized while some experimentation was going on with how the file system works. Machines with later ROMs are fine. We patch the 6100/7100/8100 ROM to bring this ROM family up to date. This only affects these three classes of machine. It affects them at any clock speed.
Floppy disk formatting
----------------------
On fast processors (180 Mhz or better, 604e), floppy disk formatting would sometimes fail because the code didn't wait long enough to switch heads to the second side. This left the second side unformatted. We changed the timing in the floppy disk formatting routines for this case, and now format floppies correctly. Some machines may have an extension called "PowerMac Format Patch" which does the same thing. If System 7.5.5 installer detects this extension, it should delete it. (The extension will not install its code under System 7.5.5 or later.)
Emulator cache flush bug
------------------------
If the emulator was requested to flush a non-existing memory range, the emulator could get stuck in an infinite loop. We now check the range to be flushed and exit if invalid memory is specified. This fix affects the PowerBook 5300, 2300, and PCI-based desktop Macintosh computers.
CalcCMask
---------
When color searchprocs were used with CalcCMask the resulting bit mask was randomly shifted to the left creating a jagged edge. This shifting effect was caused by a logic error in an internal QuickDraw macro. The macro returned incorrect mask values (0 / 0xFF instead of 0 / 1) to CalcCMask when the destination pixel depth was 1 bit.
File Manager flush bug
----------------------
The File Manager was making a request to flush a non-existing memory range. Because of the Emulator cache flush bug described above, the emulator would get stuck in an infinite loop. We patch _GetFPos, _SetFPos, and _Read to fix this problem. This fix affects the PowerBook 5300, 2300, and PCI-based desktop Macintosh computers.
Infrared Remote
---------------
On machines which support Infrared Remote Control, there were two problems which could arise. If the CPU was powered up using the remote control, further remote control commands were ignored. If the CPU was powered up normally via the keyboard, the remote control commands would work correctly. However if the volume up or down button was held down (causing repeated Infrared Remote commands) for a sufficient length of time, infrared commands would stop working. This was caused by a patch which wasn't getting installed under some circumstances. This fix applies to all machines which support Infrared Remote Control.
LocalTalk DMA
-------------
Fixes a potential data corruption problem when the Macintosh 5400/120 is configured as follows: as a server with multiple clients connected, and simultaneously as an Apple Remote Access server with at least one Apple Remote Access client connected and that client is logged onto a server via Apple Remote Access. When lots of traffic was being generated, the clients could experience data corruption when copying files to or from the Macintosh 5400/120 server. We also fixed a problem where LocalTalk DMA 1.0 would load on machines without the proper hardware.
IR Talk
-------
System 7.5.3 Revision 2 forgot to include the control panel and driver for IR Talk, so a machine which shipped with System 7.5.3 installed and upgraded directly to System 7.5.3 Revision 2 did not have the same IR Talk drivers as a machine which had System 7.5 Update 2.0 installed, or a machine which had System 7.5 Version 7.5.3 installed.
Ethernet on 5400/6400
---------------------
On the Macintosh 5400 and 6400 models, the Ethernet support had a bug which manifested itself on very busy Ethernets. These models could have slow communications because of dropped packets. This was due to an internal setting which gave higher priority to certain kinds of packets. Now all packets have the same priority.
SCSI Manager
------------
Added a call to LockMemoryForOutput() as described in the Virtual Memory paragraph.
We changed the interrupt level at which SCSI completion routines get executed from level 2 to level 1. Because the interrupt level was at level 2 the SCSI completion routines slowed the performance of expansion cards (such as video capture and sound cards) whose interrupt level was also at level 2. This affects only PowerPC machines running a native version of SCSI Manager 4.3.
We corrected several errors with the MESH SCSI Controller (found on the desktop PowerPC Macintosh computers.) ACK could be released before REQ. There was a disconnect/reconnect bug with reads on old tape drives. We could misread interrupts from the MESH chip.
We fixed two bugs related to the internal SCSI bus on PCI Macs with Fast SCSI. First, we could occasionally mishandle a reconnect if it came in at precisely the same instant we were attempting a new command on the bus. Second, there was a bug in the Mesh controller which could cause it to give a command done interrupt before the target had released REQ. On a fast machine it was possible to issue a new command to the chip while REQ was still on the bus. The controller interpreted this as a new byte and we transferred it twice. This only happens on asynchronous in phases such as message in, asynchronous data in or status phase. The usual result of this bug was a hang. We now wait for REQ to be removed by the device before issuing a new command to the chip.
Sharing printers
----------------
Under some conditions involving a blank name in Sharing Setup and the use of shared printers, you could fail to print with a "Resource Not Found" error. This was because System 7.5 Update 2.0 deleted the blank Pascal string used by Sharing Setup. We reinstall the blank user name string if it is missing. This would only affect some Performa users and some users who had never set their user name, but upgraded with System 7.5 Update 2.0.
PCI startup hang
----------------
On 180 Mhz and faster PCI Macs, there was a bug initializing the PCI bridge chip. This made the PCI bus inaccessible during system startup, resulting in a hang. We now initialize the PCI bridge chip more reliably.
Interrupt Service Routines
--------------------------
If you exit an interrupt service routine at a lower interrupt level than that set when you entered the routine, the interrupt level isn't cleared properly, and you won't process any interrupts of lower priority until an interrupt of the original priority or higher is encountered. This affects PCI Macs and Macs with PowerPC upgrade cards installed. The work around for developers is to ensure that you exit any interrupt service routine at the same priority as that which was set when you entered the routine. We fixed a Sound Manager interrupt service routine which was doing this on desktop Macs with PowerPC upgrade cards.
Control Panels and Shared Libraries
-----------------------------------
This was noticed during the testing of System 7.5.5. We discovered a third party control panel which was linked with MathLib (probably because it linked with CLib.) Because MathLib is also in ROM, space was allocated for the MathLib globals twice. Because control panels run in the Finder process space, the MathLib globals space was allocated in the Finder's application heap, not in the system heap.
On most machines, the MathLibs globals allocated by the ROM combined with the 22K of MathLib globals allocated by the linked MathLib library are small enough to fit in the free and purgable space left in the Finder's application heap. But on the PowerMac 7500/8500/9500, the MathLib globals allocated by the ROM are also 22K, and the combined 44K of MathLib globals uses all but a few bytes of the Finder's application heap. This results in repeated "Out Of Memory" warnings whenever you try to do anything in the Finder.
Future System Software Support
==============================
With the release of System 7.5.5 Update, Apple is delivering its final system software release for the Macintosh Plus, SE, Classic, Portable, PowerBook 100, SE FDHD, SE/30, LC, II, IIx, and IIcx. These computers were not designed to support 32-bit memory addressing. Future Mac OS releases will require 32-bit memory addressing, which is supported by all other Macintosh models.
What Happened to 7.5.4?
=======================
System 7.5.4 was declared finished. Distribution to seed sites had already begun. A problem was found which led to us halting distribution and revising the product. Rather than having to struggle with two versions of 7.5.4 and the resulting confusion this would cause, we decided to revise the product version number to 7.5.5.
The differences between 7.5.4 and 7.5.5 are:
• A revision to the IR Talk for the Macintosh 5400 and 6400 families.
• We save the VM preferences and chosen desktop pattern when installing on
the Macintosh 5400 and 6400 families.
• A minor revision of the Energy Saver control panel.
Detecting System 7.5.5
======================
To distinguish between the multiple versions of system software, the 'sysu' Gestalt selector has been provided. It returns the version number of the currently installed system update, formatted according to the same conventions as the version numbering used in 'vers' resources, as illustrated in Figure 1.
Begin_Graphic
Figure 1
The format of the Gestalt response for the 'sysu' selector.
+---+---+---+---+---+---+---+---+
| 0 2 | 0 6 | 8 0 | 0 0 |
+---+---+---+---+---+---+---+---+
+---+---+
| 0 2 | the Major revision level
+---+---+
+---+---+
| 0 6 | the Minor revision level
+---+---+
+---+---+
| 8 0 | the Development stage
+---+---+
+---+---+
| 0 0 | the Prerelease revision
+---+---+
End_Graphic
The presence of the 'sysu' Gestalt selector allows application programs to determine if the current installed system software version was established using the system update. The 'sysu' Gestalt selector will only be defined if a system update package was used to establish the current system version: the 'sysu' selector is not defined on machines shipped with System 7.5.3 preinstalled, nor on system software versions earlier than 7.5.3.
Using the 'sysv' and 'sysu' Gestalt Selectors
---------------------------------------------
Here is how you can use the 'sysv' and the 'sysu' Gestalt selectors to establish information about System 7.5.5:
long response, updateversion;
OSErr err;
Boolean seven_five_five;
Boolean is_an_update;
seven_five_five = false;
is_an_update = false;
err = Gestalt(gestaltSystemVersion, &response);
if (err == noErr) {
seven_five_five = (response == 0x00000755);
if (seven_five_five) {
err = Gestalt('sysu', &updateversion);
is_an_update = (err == noErr);
}
}
/* at this point, seven_five_five will be true if system 7.5.5 is the current operating system, and is_an_update will be true if the current system version was established by update. if is_an_update is true, updateversion will contain the System update's version number (0x02068000 for 7.5.5). */